<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>单例模式</title>
</head>
<body>
    
</body>
<script>
    //单例模式(Singleton Pattern)
    //单例模式涉及到一个单一的类，该类负责创建自己的对象，同时确保只有单个对象被创建。
    //这个类提供了一种访问其唯一对象的方式，可以直接访问，不需要实例化该对象

    //单例模式的特点
    // 1、单例类只能有一个实例
    // 2、单例类必须自己创建自己的唯一实例
    // 3、单例类必须给所有其他对象提供这一示例

    let box
    const createBox = (_a,_b)=>{
        if(!box){
            box={}
        }
        box.a=_a
        box.b=_b
        return box
    }

    const obj1=createBox(3,6)
    // console.log(obj1)
    // {a:3,b:6}

    const obj2=createBox(10,20)
    console.log(obj1) 
    // {a:10,b:20}
    console.log(obj2)
    // {a:10,b:20}

    //结论：
    //单例模式可以创建多个实例，但是只要改变其中任一实例对象的属性值，其他实例对象的属性值都会改变
    //所以单例类只能有一个实例，否则会出错

    //拓展
    //为什么改变单例模式下某一个实例的属性值，其他实例的属性值也会跟着改变？
    //解析
    //对象的浅拷贝：拷贝的仅仅是引用地址而不是值，所以无论改变了哪一个对象的属性值其他对象的属性值也会跟着改变
    //对象的深拷贝：把对象的引用地址和值一起拷贝过来，每个对象作为独立的存在，修改某个对象的属性值，其他对象的属性值并不受影响
</script>
</html>